<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>提升练习</title>
    <script>

        var a=1
        function fn(){
            //变量var的提升适用于函数作用域，所以a=2先被执行，第一个log输出undifined
            console.log("a=",a); //undifined
            var a=2
            console.log("a=",a); //a=2
        }
        fn()
        //函数作用域声明变量不影响全局作用域声明变量
        console.log("a=",a); //a=1

        var b=1
        //定义形参就相当于在函数中声明了对应的变量，但是没有赋值，所有第一个log输出undifined
        function fn2(b){
            console.log("b=", b); //undefined
            b=2
            console.log("b=", b); //2
        }
        fn()
        console.log("b=", b); //1

        var c=1
        //实参给变量传入的是变量的值，所以形参里有值为1
        function fn3(c){
            console.log("c=",c); //1
            c=2
            console.log("c=", c); //2
        }
        fn3(c)
        console.log("c=", c); //1
        console.log("---------");

        //var只提升定义不提升赋值，但是函数能提升赋值，所以第一个log输出alert(2)，把alert(2)函数提升了
        console.log("d=",d);    //alert(2)
        var d=1
        //赋值后d值改变
        console.log("d=", d);   //1
        function d(){
            alert(2)
        }
        //45行函数已被提升，就当没看见它，所以d值不变
        console.log("d=", d);   //1
        var d=3
        console.log("d=", d);   //3
        var d=function(){
            alert(4)
        }
        //alert(4)是赋值语句，所以它不提升；若它也为函数语句并写在alert(2)后面，则会覆盖alert(2)的值
        console.log("d=", d);   //alert(4)
        var d
        //var d只是声明语句并未赋值，则早已提升，不影响下行结果
        console.log("d=", d);   //alert(4)
    </script>
</head>
<body>
    
</body>
</html>